static char *snopt = NULL;
static char *lcopt = NULL;
+static char *purge_duplicates = NULL;
static
arglist_t dup_args[] = {
ARGTYPE_BOOL},
{"location", &lcopt, "Suppress duplicate waypoint based on coords",
ARGTYPE_BOOL},
+ {"all", &purge_duplicates, "Suppress all instances of duplicates",
+ ARGTYPE_BOOL},
{0, 0, 0, 0}
};
typedef struct btree_node {
struct btree_node *left, *right;
unsigned long data;
+ waypoint *wpt;
} btree_node;
static unsigned long crc32_table[256] =
}
static btree_node *
-addnode (btree_node * tree, btree_node * newnode)
+addnode (btree_node * tree, btree_node * newnode, btree_node **oldnode)
{
btree_node * tmp, * last;
+ if ( *oldnode ) {*oldnode = NULL;}
+
if (!tree)
return (newnode);
} else if (newnode->data > tmp->data) {
tmp = tmp->left;
} else {
+ if ( oldnode ) {
+ *oldnode = tmp;
+ }
return (NULL);
}
}
{
waypoint * waypointp;
btree_node * newnode, * btmp, * sup_tree = NULL;
+ btree_node * oldnode = NULL;
unsigned long crc = 0;
struct { char shortname[32]; char lat[13]; char lon[13]; } dupe;
waypoint * delwpt = NULL;
newnode = (btree_node *)xcalloc(sizeof(btree_node), 1);
newnode->data = crc;
+ newnode->wpt = waypointp;
- btmp = addnode(sup_tree, newnode);
+ btmp = addnode(sup_tree, newnode, &oldnode );
if (btmp == NULL) {
if ( delwpt ) {
delwpt = waypointp;
waypt_del(waypointp); /* collision */
xfree(newnode);
+ if ( purge_duplicates && oldnode ) {
+ if ( oldnode->wpt ) {
+ waypt_del( oldnode->wpt );
+ waypt_free( oldnode->wpt );
+ oldnode->wpt = NULL;
+ }
+ }
+
} else {
sup_tree = btmp;
}